package com.wufun.overseas.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by pengsk on 2014/12/29.
 */
public class MD5Util {
    public static String stringToMD5(String string) {
        byte[] hash;

        try {
            hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }

        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10)
                hex.append("0");
            hex.append(Integer.toHexString(b & 0xFF));
        }

        return hex.toString();
    }
//    /**
//     * 生成账号系统相关的签名
//     *
//     * @param args
//     * @return
//     */
//    public static String getAccountSign(Map<String, String> args,String    appPrivateKey) {
//        if (args == null || args.size() == 0) return "";
//
//        Set<Map.Entry<String, String>> entries       = null;
//        Iterator<Map.Entry<String, String>> iterator      = null;
//        List<String> list          = null;
//        StringBuffer sb = new StringBuffer(appPrivateKey);
//
//        entries = args.entrySet();
//        iterator = entries.iterator();
//        Map.Entry<String, String> entry = null;
//        list = new ArrayList<String>();
//        while (iterator.hasNext()) {
//            entry = iterator.next();
//            list.add(entry.getKey() + "=" + entry.getValue());
//        }
//        Collections.sort(list);
//        for (int i = 0; i < list.size(); i++) {
//            sb.append(list.get(i));
//            sb.append("&");
//        }
//        sb.deleteCharAt(sb.length() - 1);
//        return MD5Utils.stringToMD5(sb.toString());
//    }

    /**
     * 获取单个文件的MD5值！

     * @param file
     * @return
     */

    public static String getFileMD5(File file) {
        if (!file.isFile()) {
            return "";
        }
        MessageDigest digest = null;
        FileInputStream in = null;
        byte buffer[] = new byte[1024*100];
        int len;
        try {
            digest = MessageDigest.getInstance("MD5");
            in = new FileInputStream(file);
            while ((len = in.read(buffer, 0, 1024*100)) != -1) {
                digest.update(buffer, 0, len);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
        BigInteger bigInt = new BigInteger(1, digest.digest());
        return bigInt.toString(16);
    }

    /**
     * 获取文件夹中文件的MD5值
     *
     * @param file
     * @param listChild
     *            ;true递归子目录中的文件
     * @return
     */
    public static Map<String, String> getDirMD5(File file, boolean listChild) {
        if (!file.isDirectory()) {
            return null;
        }
        Map<String, String> map = new HashMap<String, String>();
        String md5;
        File files[] = file.listFiles();
        for (int i = 0; i < files.length; i++) {
            File f = files[i];
            if (f.isDirectory() && listChild) {
                map.putAll(getDirMD5(f, listChild));
            } else {
                md5 = getFileMD5(f);
                if (md5 != null) {
                    map.put(f.getPath(), md5);
                }
            }
        }
        return map;
    }
}
